import {queryProductById} from '@/api/category';
import {delayNavigateTo, getCurrentPage} from '@/utils/navigator';

import type {IProduct} from '@/typings/interface';
import type {ICategoryStateRequest} from '@/typings/api';

type CategoryState = ICategoryStateRequest;

export const useCategory = defineStore('category', () => {
    let end = $ref(false); // 接口无更多数据
    let products = $ref<IProduct[]>([]); // 分类课程列表初始数组
    let categoryState = $ref<CategoryState>()!;

    async function init(_categoryState: Partial<CategoryState>) {
        // @ts-expect-error 入参属性可选导致不匹配
        categoryState = _categoryState;

        // 请求课程列表数据
        await sendRequest();
    }

    async function change(_categoryState: Partial<CategoryState>) {
        // 切换分类重置为第一页和请求新的分类数据
        end = false;
        categoryState.page = 1;

        // 切换分类相同的属性覆盖值
        categoryState = {
            ...categoryState,
            ..._categoryState,
        };

        // 跳转页面
        _href();

        // 请求课程列表数据
        await sendRequest();
    }

    async function sendRequest(nextPage?: boolean) {
        // 如果接口没有更多数据，滑动底部不再请求
        console.log(222);
        if (end) return;

        // 判断是滑动请求，页数则加1
        nextPage && (categoryState.page = categoryState.page + 1);

        const data = (
            await queryProductById({
                ...categoryState,
                categoryId:
                    categoryState.categoryId && categoryState.categoryId !== -1
                        ? categoryState.categoryId
                        : undefined,
                categoryParentId:
                    categoryState.categoryParentId &&
                    categoryState.categoryParentId !== -1
                        ? categoryState.categoryParentId
                        : undefined,
            })
        ).data.current_data;

        // 如果接口最后页的数据长度少了12，则无更多数据
        if (data.length < 12) end = true;

        // 判断是否滑动请求更多，是则和之前请求数据组合
        products = nextPage ? [...products, ...data] : data;
    }

    // 跳转当前页面，携带参数
    function _href() {
        // 跳转页面，{ isHistory: true } 更新当前url
        delayNavigateTo(
            `${getCurrentPage().path}?pid=${categoryState.categoryParentId}&id=${
                categoryState.categoryId
            }`,
            {isHistory: true}
        );
    }

    return $$({
        end,
        products,
        categoryState,
        init,
        change,
        sendRequest,
    });
});

